/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SintaticoPacote;
import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;
/**
 *
 * @author Laue
 */
public class parametrosChamadaDeFuncao

{
    ExpressaoAritmetica exp = new ExpressaoAritmetica();

    public boolean isInParametroChamadaDeFuncao(TabelaSimbolos tabelaSimbolos)//essa função diz se o que vou enviar está aqui
    {
        if(tabelaSimbolos.getLookahead().equals("&") || tabelaSimbolos.getLookahead().equals("*"))
        {
            if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
            {
                if(tabelaSimbolos.getTipo().equals("identificador"))
                {
                    if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                    {
                        while(tabelaSimbolos.getLookahead().equals("["))
                        {
                            if(tabelaSimbolos.reconhecer("["))
                            {
                                if(tabelaSimbolos.getTipo().equals("numero"))
                                {
                                    if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                                    {
                                        if(tabelaSimbolos.getLookahead().equals("]"))
                                        {
                                            tabelaSimbolos.soConsome();
                                        }
                                        else
                                        {
                                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //se nao achar }
                                        }
                                    }
                                    else
                                        return false;
                                }
                                else if(tabelaSimbolos.getTipo().equals("identificador"))
                                {
                                    if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                                    {
                                        if(tabelaSimbolos.getLookahead().equals("]"))
                                        {
                                            tabelaSimbolos.soConsome();
                                        }
                                        else
                                        {
                                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //se nao achar }
                                        }
                                    }
                                    else
                                        return false;
                                }
                                else
                                {
                                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                    return false; //se nao achar }
                                }
                            }
                            else
                                return false;
                        }
                    return true;
                        
                    }
                    else
                        return false;
                }
                else
                {
                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //se nao achar }
                }
            }
            else
                return false;
        }
        else if(tabelaSimbolos.getTipo().equals("numero"))
        {
            if(tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals(","))
            {
                if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                {
                    return true;
                }
                else
                    return false;
            }
            else if(tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                if(exp.expAritmetica(tabelaSimbolos))
                {
                    return true;
                }
                else
                    return false;
            }
            else if(tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals(")"))
            {
                if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                {
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }
        else if(tabelaSimbolos.getTipo().equals("frase"))
        {
                    if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                    {
                        return true;
                    }
                    else
                        return false;
        }
        else if(tabelaSimbolos.getTipo().equals("identificador"))
        {
            if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals(","))
            {
                if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                {
                    return true;
                }
                else
                    return false;
            }
            else if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                if(exp.expAritmetica(tabelaSimbolos))
                {
                    return true;
                }
                else
                    return false;
            }
            else if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals(")"))
            {
                if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
                {
                    return true;
                }
                else
                    return false;
            }
            else
            {
                 ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                 TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                 return false; //se nao achar }
            }
        }
        else if(tabelaSimbolos.getLookahead().equals("true") || tabelaSimbolos.getLookahead().equals("false"))
        {
            if(tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead()))
            {
                return true;
            }
            else
                return false;
        }
        else
        {
            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " boolean ou identificador ou frase ou numero ou * ou &  esperado");
            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false; //se nao achar }
        }
    }




}
